# -*- coding: utf-8 -*-
"""
全局应用配置模块

本模块定义了LLM后端服务的全局配置，包括：
- 应用基础信息配置
- 日志系统配置
- API服务配置
- 数据存储配置

配置采用环境变量优先的策略，便于在不同环境中灵活部署。
"""
import os
from typing import Optional, Dict, Any


class Settings:
    """
    应用全局配置类
    
    管理应用运行时的所有配置参数，包括服务配置、日志配置、存储配置等。
    设计原则：
    1. 环境变量优先：支持通过环境变量覆盖默认配置
    2. 类型安全：使用类型注解确保配置值的类型正确性
    3. 合理默认值：提供适合开发和生产环境的默认配置
    """
    
    # ==================== 应用基础配置 ====================
    # 应用名称，用于日志标识和API文档标题
    APP_NAME: str = "LLM Backend LangChain"
    
    # 应用版本号，遵循语义化版本规范
    VERSION: str = "1.0.0"
    
    # 调试模式开关，影响日志级别和错误处理方式
    # 生产环境应设置为False，开发环境可设置为True
    DEBUG: bool = os.getenv("DEBUG", "False").lower() == "true"
    
    # ==================== 日志系统配置 ====================
    # 日志级别，控制日志输出的详细程度
    # 可选值：DEBUG, INFO, WARNING, ERROR, CRITICAL
    # INFO级别适合生产环境，DEBUG级别适合开发调试
    LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")
    
    # 日志文件路径，相对于项目根目录
    # 日志文件会自动轮转，避免单个文件过大
    LOG_FILE: str = "logs/app.log"
    
    # 日志格式配置
    LOG_FORMAT: str = "{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}"
    
    # 日志文件轮转配置：单个文件最大10MB
    LOG_ROTATION: str = "10 MB"
    
    # 日志保留时间：保留30天的日志文件
    LOG_RETENTION: str = "30 days"
    
    # ==================== API服务配置 ====================
    # API服务监听的主机地址
    # 0.0.0.0 表示监听所有网络接口，适合容器化部署
    # 127.0.0.1 只监听本地回环接口，适合本地开发
    API_HOST: str = os.getenv("API_HOST", "0.0.0.0")
    
    # API服务监听的端口号
    # 8000是FastAPI的默认端口，也是常用的开发端口
    API_PORT: int = int(os.getenv("API_PORT", "8000"))
    
    # API请求超时时间（秒）
    API_TIMEOUT: int = int(os.getenv("API_TIMEOUT", "30"))
    
    # API文档路径配置
    API_DOCS_URL: str = "/docs"  # Swagger UI文档路径
    API_REDOC_URL: str = "/redoc"  # ReDoc文档路径
    
    # ==================== 数据存储配置 ====================
    # 向量数据库存储路径，用于存储FAISS索引文件
    # FAISS是Facebook开源的高效向量检索库
    VECTOR_DB_PATH: str = "data/vectorstores/faiss_db"
    
    # 原始数据存储路径
    RAW_DATA_PATH: str = "data/raw"
    
    # 处理后数据存储路径
    PROCESSED_DATA_PATH: str = "data/processed"
    
    # ==================== 性能配置 ====================
    # 向量检索时返回的最大结果数量
    MAX_SEARCH_RESULTS: int = int(os.getenv("MAX_SEARCH_RESULTS", "10"))
    
    # 批处理大小，用于批量处理文档或查询
    BATCH_SIZE: int = int(os.getenv("BATCH_SIZE", "32"))
    
    def validate_settings(self) -> bool:
        """
        验证配置的有效性
        
        检查关键配置项是否合理，确保应用能够正常启动。
        
        Returns:
            bool: 配置是否有效
        """
        # 检查端口号范围
        if not (1 <= self.API_PORT <= 65535):
            return False
        
        # 检查日志级别
        valid_log_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
        if self.LOG_LEVEL.upper() not in valid_log_levels:
            return False
        
        # 检查超时时间
        if self.API_TIMEOUT <= 0:
            return False
        
        # 检查批处理大小
        if self.BATCH_SIZE <= 0:
            return False
        
        return True
    
    def get_settings_summary(self) -> Dict[str, Any]:
        """
        获取配置摘要信息
        
        返回当前配置的关键信息，用于启动时的配置确认和调试。
        
        Returns:
            Dict[str, Any]: 配置摘要字典
        """
        return {
            "app_name": self.APP_NAME,
            "version": self.VERSION,
            "debug_mode": self.DEBUG,
            "log_level": self.LOG_LEVEL,
            "api_endpoint": f"{self.API_HOST}:{self.API_PORT}",
            "vector_db_path": self.VECTOR_DB_PATH,
            "max_search_results": self.MAX_SEARCH_RESULTS
        }
    
    def create_directories(self) -> None:
        """
        创建必要的目录结构
        
        确保日志目录、数据目录等必要的目录存在，
        避免应用启动时因目录不存在而报错。
        """
        import os
        
        # 创建日志目录
        log_dir = os.path.dirname(self.LOG_FILE)
        if log_dir:
            os.makedirs(log_dir, exist_ok=True)
        
        # 创建数据目录
        os.makedirs(self.RAW_DATA_PATH, exist_ok=True)
        os.makedirs(self.PROCESSED_DATA_PATH, exist_ok=True)
        os.makedirs(os.path.dirname(self.VECTOR_DB_PATH), exist_ok=True)


# 创建全局配置实例
# 这个实例在模块导入时创建，其他模块可以直接导入使用
# 例如：from config.settings import settings
settings = Settings()